xref: /expo/guides/Developing Expo Go.md (revision bb8f4f99)
1# Developing Expo Go
2
3- [Introduction](#introduction)
4- [External Contributions](#external-contributions)
5- [Configuring your environment](#configuring-your-environment)
6  - [iOS](#ios)
7  - [Android](#android)
8- [Running on a Device](#running-on-a-device)
9  - [iOS](#ios-1)
10  - [Android](#android-1)
11- [Standalone Apps](#standalone-apps)
12  - [Android](#android-2)
13  - [iOS](#ios-2)
14- [Modifying JS Code](#modifying-js-code)
15- [Tests](#tests)
16
17  - [iOS](#ios-3)
18
19## Introduction
20
21This is the source code for the Expo Go app used to view projects published to the Expo service. If you want to build and install Expo Go directly onto a device, you're in the right place. Note that if you just want to install Expo Go on a simulator, you do not need to build it from source. Instead, you should [follow the instructions here](https://docs.expo.io/versions/latest/introduction/installation.html).
22
23To build Expo Go, follow the instructions in the [Setup](#setup) section below. Use the [Expo CLI](https://docs.expo.io/versions/latest/workflow/expo-cli) to use Expo's infrastructure to build your app.
24
25Please ask us on the [forums](https://forums.expo.io/) if you get stuck.
26
27## External Contributions
28
29Please check with us before putting work into a Pull Request! We don't yet have a good guide available that covers the nuances of how to work with Expo Go and the types of PRs that we accept so you will want a direct line of communication with someone on the team to ask us questions. The best place to talk to us is either on Slack at https://slack.expo.io or the forums at https://forums.expo.io.
30
31**Disclaimers:**
32
33If you want to build a standalone app that has a custom icon and name, see [our documentation here](https://docs.expo.io/versions/latest/distribution/building-standalone-apps/). You're in the wrong place and you shouldn't need to build Expo Go from source.
34
35If you need to make native code changes to your Expo project, such as adding custom native modules, we can [generate a native project for you](https://docs.expo.io/versions/latest/expokit/eject). You're in the wrong place and you shouldn't need to build Expo Go from source.
36
37## Configuring your environment
38
39Note: We support building Expo Go only on macOS.
40
41- Install [direnv](http://direnv.net/)
42- Clone this repo; we recommend cloning it to a directory whose full path does not include any spaces (you should clone all the submodules with `git clone --recurse-submodules`)
43- Run `yarn` in the root directory.
44- Run `npm run setup:native` in the root directory.
45- Run `yarn build` in the `packages/expo` directory.
46
47### iOS
48
49- Make sure you have latest non-beta Xcode installed.
50- Run `et ios-generate-dynamic-macros`.
51- Open and run `ios/Exponent.xcworkspace` in Xcode.
52
53### Android
54
55- Make sure you have Android Studio 3 installed
56- See "Running on a Device"
57
58## Running on a Device
59
60### iOS
61
62- In Xcode's menu bar, open the **Xcode** drop-down menu, and select **Preferences**. Then in the **Accounts** tab of the preferences menu, add your personal or team apple developer account.
63- Connect your test device to your computer with a USB cable.
64- In Xcode's menu bar, open the **Product** drop-down menu, select **Destination**, then in the _Device_ grouping select your device.
65- In the project navigator, select the **Exponent** project to bring up the project's settings, and then:
66  - In the **General** tab, in the **Identity** section, put in a unique Bundle Identifier.
67  - Also in the **General** tab, in the **Signing** section, select your personal or team apple developer account as your **Team**, and create a new signing certificate by clicking **Fix Issue**.
68- Finally, run the build
69
70### Android
71
72- If the Play Store version of the Expo Go is installed on your test device, uninstall it.
73- Connect your test device to your computer with a USB cable.
74- Run `fastlane android start`, or alternately open the `android` directory in Android Studio, start it, and in the **Select Deployment Target** dialog, select your device.
75  - You can also run `./gradlew installDebug` from the `android` directory.
76  - If you're having trouble building the Android app, trying clearing your gradle cache with `./gradlew clean` and rebuilding.
77
78## Standalone Apps
79
80If you don't need custom native code outside of the Expo SDK, head over to [our documentation on building standalone apps without needing Android Studio and Xcode](https://docs.expo.io/versions/latest/distribution/building-standalone-apps/).
81
82If you need standalone apps as built by running `expo build:ios` or `expo build:android` for a supported SDK version, check out our docs on [using turtle-cli to build apps locally or on CI](https://docs.expo.io/versions/latest/distribution/turtle-cli/).
83
84If you're still here, you need to build a standalone app with code currently on `master` or another unreleased branch. Make sure to follow the [Configure app.json](https://docs.expo.io/versions/latest/distribution/building-standalone-apps/#2-configure-appjson) section of the docs before continuing. You'll need to add the appropriate fields to your `app.json` before the standalone app scripts can run. Once that's done, continue on to the platform-specific instructions.
85
86### Android
87
88The Android standalone app script creates a new directory `android-shell-app` with the modified Android project in it. It then compiles that new directory giving you a signed or unsigned `.apk` depending on whether you provide a keystore and the necessary passwords. If there are issues with the app you can open the `android-shell-app` project in Android Studio to debug.
89
90Here are the steps to build a standalone Android app:
91
92- Publish your experience with Expo CLI. Note the published URL.
93- If you want a signed `.apk`, run `et android-shell-app --url [the published experience url] --sdkVersion [sdk version of your experience] --keystore [path to keystore] --alias [keystore alias] --keystorePassword [keystore password] --keyPassword [key password]`.
94- If you don't want a signed `.apk`, run `et android-shell-app --url [the published experience url] --sdkVersion [sdk version of your experience]`.
95- The `.apk` file will be at `/tmp/shell-signed.apk` for a signed `.apk` or at `/tmp/shell-debug.apk` for an unsigned `.apk`.
96
97### iOS
98
99The iOS standalone app script has two actions, `build` and `configure`. `build` creates an archive or a simulator build of the Expo iOS workspace. `configure` accepts a path to an existing archive and modifies all its configuration files so that it will run as a standalone Expo project rather than in Expo Go.
100
101Here are the steps to build a standalone iOS app:
102
103- Publish your experience with Expo CLI. Note the published URL.
104- `et ios-shell-app --action build --type [simulator or archive] --configuration [Debug or Release]`
105- The resulting archive will be created at `../shellAppBase-[type]`.
106- `et ios-shell-app --url [the published experience url] --action configure --type [simulator or archive] --archivePath [path to ExpoKitApp.app] --sdkVersion [sdk version of your experience] --output your-app.tar.gz`
107- This bundle is not signed and cannot be submitted to iTunes Connect as-is; you'll need to manually sign it if you'd like to submit it to Apple. [Fastlane](https://fastlane.tools/) is a good option for this. Also, [Expo will do this for you](https://docs.expo.io/versions/latest/distribution/building-standalone-apps/) if you don't need to build this project from source.
108- If you created a simulator build in the first step, unpack the tar.gz using `tar -xvzf your-app.tar.gz`. Then you can run this on iPhone Simulator using `xcrun simctl install booted <app path>` and `xcrun simctl launch booted <app identifier>`. Another alternative which some people prefer is to install the [ios-sim](https://github.com/phonegap/ios-sim) tool and then use `ios-sim launch <app path>`.
109- There are a few more optional flags you can pass to this script. They are all documented in the block comments inside `xdl/src/detach/IosShellApp.js`.
110
111## Modifying JS Code
112
113The Expo Go apps run a root Expo project in addition to native code. By default this will use a published version of the project, so any changes made in the `home` directory will not show up without some extra work.
114
115Serve this project locally by running `expo start` from the `home` directory. On iOS, you'll additionally need to set `DEV_KERNEL_SOURCE` to `LOCAL` in `EXBuildConstants.plist` (the default is `PUBLISHED`).
116
117The native Android Studio and Xcode projects have a build hook which will find this if `expo start` is running. Keep this running and rebuild the app on each platform.
118
119## Tests
120
121### iOS
122
123For native XCTest unit tests:
124
125- Press Command+U in XCode to build and test the `Tests` unit test target.
126- Alternatively, run `fastlane ios test` from the parent directory of `ios`.
127
128For JS integration tests, test the `ExponentIntegrationTests` target (not included in the default test scheme). This target requires you to configure `EXTestEnvironment.plist` with a key `testSuiteUrl` whose value is the URL to load some version of Expo's [test-suite](apps/test-suite) app. This will run a bunch of Jasmine tests against the Expo SDK.
129